/**
 * 
 */
package com.roshan.web.service;

import com.roshan.web.dto.AuthenticatePasswordRecoveryCodeDetail;
import com.roshan.web.dto.AuthenticatePasswordRecoveryCodeResult;
import com.roshan.web.dto.CustomerIdentificationDetail;
import com.roshan.web.dto.CustomerIdentificationProfile;
import com.roshan.web.dto.ResetPasscodeDetail;
import com.roshan.web.dto.ResetPasscodeResult;
import com.roshan.web.dto.ResetPasswordDetail;
import com.roshan.web.dto.ResetPasswordResult;
import com.roshan.web.dto.RetrievePasswordRecoveryCodeDetail;
import com.roshan.web.dto.RetrievePasswordRecoveryCodeResult;
import com.roshan.web.dto.RetrieveUsernamesByCustomerUrisDetail;
import com.roshan.web.dto.RetrieveUsernamesByCustomerUrisResult;
import com.roshan.web.dto.SecurityQuestionProfile;
import com.roshan.web.dto.TenantSecurityQuestionDetail;
import com.roshan.web.dto.TenantSecurityQuestionProfile;
import com.roshan.web.dto.UpdateExpiredPassword;
import com.roshan.web.dto.UpdateExpiredPasswordDetail;
import com.roshan.web.dto.UpdateMFAQuestionProfile;
import com.roshan.web.dto.UpdatePasscode;
import com.roshan.web.dto.UpdateUserSecurityDetail;
import com.roshan.web.dto.UpdateUserSecurityProfile;
import com.roshan.web.dto.WSCommunicationStatus;

public interface ISecurityManagerService {

    /**
     * Validate security answer.
     * 
     * @param securityQuestionProfile the security question profile
     * @return true, if successful
     */
    boolean validateSecurityAnswer(SecurityQuestionProfile securityQuestionProfile);

    /**
     * Update customer security info.
     * 
     * @param updateUserSecurityProfile the update user security profile
     * @return the update user security detail
     */
    UpdateUserSecurityDetail updateCustomerSecurityInfo(UpdateUserSecurityProfile updateUserSecurityProfile);

    /**
     * Update expired user password.
     * 
     * @param expiredPassword the expired password
     * @return the update expired password detail
     */
    UpdateExpiredPasswordDetail updateExpiredUserPassword(UpdateExpiredPassword expiredPassword);

    /**
     * Retrieve tenant security questions.
     * 
     * @param tenantSecurityQuestionProfile the tenant security question profile
     * @return the tenant security question detail
     */
    TenantSecurityQuestionDetail retrieveTenantSecurityQuestions(
            TenantSecurityQuestionProfile tenantSecurityQuestionProfile);

    /**
     * Update mfa questions.
     * 
     * @param updateMFAQuestionProfile the update mfa question profile
     * @return true, if successful
     */
    boolean updateMFAQuestions(UpdateMFAQuestionProfile updateMFAQuestionProfile);

    /**
     * Update user passcode.
     * 
     * @param updatePasscode the update passcode
     * @return the wS communication status
     */
    WSCommunicationStatus updateUserPasscode(UpdatePasscode updatePasscode);

    /**
     * Retrieve password reset request.
     * 
     * @param detail the detail
     * @return the retrieve password recovery code result
     */
    RetrievePasswordRecoveryCodeResult retrievePasswordResetRequest(RetrievePasswordRecoveryCodeDetail detail);

    /**
     * Retrieve usernames by customer uris.
     * 
     * @param detail the detail
     * @return the retrieve usernames by customer uris result
     */
    RetrieveUsernamesByCustomerUrisResult retrieveUsernamesByCustomerUris(RetrieveUsernamesByCustomerUrisDetail detail);

    /**
     * Authenticate password recovery code.
     * 
     * @param detail the detail
     * @return the authenticate password recovery code result
     */
    AuthenticatePasswordRecoveryCodeResult authenticatePasswordRecoveryCode(
            AuthenticatePasswordRecoveryCodeDetail detail);

    /**
     * Reset user password.
     * 
     * @param detail the detail
     * @return the reset password result
     */
    ResetPasswordResult resetUserPassword(ResetPasswordDetail detail);

    /**
     * Reset user passcode.
     * 
     * @param detail the detail
     * @return the reset passcode result
     */
    ResetPasscodeResult resetUserPasscode(ResetPasscodeDetail detail);

    /**
     * Checks if is customer exists.
     * 
     * @param customerIdentificationProfile the customer identification profile
     * @return the customer identification detail
     */
    CustomerIdentificationDetail isCustomerExists(CustomerIdentificationProfile customerIdentificationProfile);
}
